Coverage Report

Created: 2026-04-21 11:31

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
D:\a\scloud-dns\scloud-dns\src\exceptions\mod.rs
Line
Count
Source
1
use crate::dns::q_class::DNSClass;
2
use strum_macros::EnumIter;
3
4
mod tests;
5
6
#[repr(u16)]
7
#[allow(non_camel_case_types)]
8
#[derive(Debug, PartialEq, EnumIter, Clone)]
9
pub enum SCloudException {
10
    // HEADER SECTION
11
    SCLOUD_HEADER_DESERIALIZATION_FAILED = 0,
12
    SCLOUD_HEADER_BYTES_EMPTY = 1,
13
14
    // QUESTION SECTION
15
    SCLOUD_QUESTION_DESERIALIZATION_FAILED = 2,
16
    SCLOUD_QUESTION_SERIALIZATION_FAILED_QNAME_TOO_LONG = 3,
17
18
    // ANSWER SECTION
19
    SCLOUD_ANSWER_DESERIALIZATION_FAILED = 4,
20
    SCLOUD_ANSWER_DESERIALIZATION_FAILED_LABEL_TOO_LONG = 5,
21
    SCLOUD_IMPOSSIBLE_PARSE_ANSWER_HEADER_TOO_SHORT = 6,
22
    SCLOUD_IMPOSSIBLE_PARSE_ANSWER_RDATA_OUT_OF_BOUNDS = 7,
23
24
    // AUTHORITY SECTION
25
    SCLOUD_AUTHORITY_DESERIALIZATION_FAILED_RDATA_OUT_OF_BOUNDS = 8,
26
    SCLOUD_AUTHORITY_DESERIALIZATION_FAILED_BUF_TOO_SHORT = 9,
27
28
    // ADDITIONAL SECTION
29
    SCLOUD_ADDITIONAL_DESERIALIZATION_FAILED = 10,
30
    SCLOUD_ADDITIONAL_DESERIALIZATION_FAILED_BUF_TOO_SHORT = 11,
31
    SCLOUD_ADDITIONAL_DESERIALIZATION_FAILED_QNAME_TOO_LONG = 12,
32
    SCLOUD_ADDITIONAL_DESERIALIZATION_FAILED_RDATA_OUT_OF_BOUNDS = 13,
33
34
    // QNAME
35
    SCLOUD_IMPOSSIBLE_PARSE_QNAME = 14,
36
    SCLOUD_IMPOSSIBLE_PARSE_QNAME_POS_GREATER_THAN_BUF = 15,
37
    SCLOUD_IMPOSSIBLE_PARSE_QNAME_POS_AND_LEN_GREATER_THAN_BUF = 16,
38
    SCLOUD_IMPOSSIBLE_PARSE_QNAME_COMPRESSION_FAILED = 17,
39
40
    // QTYPE
41
    SCLOUD_QTYPE_U16_FOR_DNSRECORDTYPE_UNKNOWN = 18,
42
    SCLOUD_QTYPE_DNSRECORDTYPE_FOR_U16_UNKNOWN = 77,
43
44
    //QCLASS
45
    SCLOUD_QCLASS_U16_FOR_DNSCLASS_UNKNOWN = 19,
46
    SCLOUD_QCLASS_DNSCLASS_FOR_U16_UNKNOWN = 20,
47
48
    // STUB RESOLVER
49
    SCLOUD_STUB_RESOLVER_INVALID_DNS_ID = 21,
50
    SCLOUD_STUB_RESOLVER_INVALID_DNS_RESPONSE = 22,
51
    SCLOUD_STUB_RESOLVER_FAILED_TO_CREATE_SOCKET = 23,
52
    SCLOUD_STUB_RESOLVER_FAILED_TO_READ_SOCKET_TIMEOUT = 24,
53
    SCLOUD_STUB_RESOLVER_FAILED_TO_SEND_TO_SOCKET = 25,
54
    SCLOUD_STUB_RESOLVER_FAILED_TO_RECV_FROM_SOCKET = 26,
55
56
    // RESOLVER
57
    SCLOUD_RESOLVER_RESPONSE_MISMATCH = 27,
58
    SCLOUD_RESOLVER_RECORD_OUT_OF_ZONE = 28,
59
    SCLOUD_RESOLVER_ANSWER_QNAME_MISMATCH = 29,
60
    SCLOUD_RESOLVER_AUTHORITY_QNAME_MISMATCH = 30,
61
    SCLOUD_RESOLVER_ADDITIONNAL_QNAME_MISMATCH = 31,
62
63
    // ZONES
64
    SCLOUD_ZONE_PARSER_FILE_NOT_FOUND = 32,
65
    SCLOUD_ZONE_PARSER_FILE_EMPTY = 33,
66
    SCLOUD_ZONE_PARSER_FAILED_TO_READ_ZONE_FILE = 34,
67
    SCLOUD_ZONE_PARSER_FAILED_TO_READ_TTL_FIELD = 35,
68
69
    // CONFIG
70
    SCLOUD_CONFIG_FILE_NOT_FOUND = 36,
71
    SCLOUD_CONFIG_IMPOSSIBLE_TO_PARSE_JSON = 37,
72
    SCLOUD_CONFIG_MISSING_FORWARDER = 38,
73
    SCLOUD_CONFIG_MISSING_ADDRESS = 39,
74
    SCLOUD_CONFIG_IMPOSSIBLE_TO_PARSE_ADDR = 40,
75
    SCLOUD_CONFIG_INVALID_SERVER_PORT = 41,
76
    SCLOUD_CONFIG_INVALID_MAX_UDP_PAYLOAD = 42,
77
    SCLOUD_CONFIG_INVALID_DNS_LIMITS = 43,
78
    SCLOUD_CONFIG_INVALID_LISTENER = 44,
79
    SCLOUD_CONFIG_DUPLICATE_LISTENER_NAME = 45,
80
    SCLOUD_CONFIG_INVALID_LISTENER_PORT = 46,
81
    SCLOUD_CONFIG_INVALID_LISTENER_PROTOCOLS = 47,
82
    SCLOUD_CONFIG_TLS_MISSING_CERT = 48,
83
    SCLOUD_CONFIG_TLS_MISSING_KEY = 49,
84
    SCLOUD_CONFIG_TLS_REQUIRES_TCP = 50,
85
    SCLOUD_CONFIG_INVALID_DOH = 51,
86
    SCLOUD_CONFIG_UNKNOWN_ACL_REFERENCE = 52,
87
    SCLOUD_CONFIG_INVALID_FORWARDER = 53,
88
    SCLOUD_CONFIG_DUPLICATE_FORWARDER_NAME = 54,
89
    SCLOUD_CONFIG_INVALID_ZONE = 55,
90
    SCLOUD_CONFIG_DUPLICATE_ZONE_NAME = 56,
91
    SCLOUD_CONFIG_ZONE_MISSING_FILE = 57,
92
    SCLOUD_CONFIG_SLAVE_MISSING_MASTERS = 58,
93
    SCLOUD_CONFIG_FORWARD_ZONE_MISSING_FORWARDERS = 59,
94
    SCLOUD_CONFIG_INVALID_INLINE_ZONE = 60,
95
    SCLOUD_CONFIG_UNKNOWN_TSIG_KEY = 61,
96
    SCLOUD_CONFIG_MX_MISSING_PRIORITY = 62,
97
    SCLOUD_CONFIG_PRIORITY_ON_NON_MX = 63,
98
    SCLOUD_CONFIG_INVALID_VIEW = 64,
99
    SCLOUD_CONFIG_DUPLICATE_VIEW_NAME = 65,
100
    SCLOUD_CONFIG_INVALID_DYNUPDATE = 66,
101
    SCLOUD_CONFIG_DYNUPDATE_UNKNOWN_ZONE = 67,
102
103
    // LOGGING
104
    SCLOUD_LOGGING_PATH_CREATION_FAILED = 68,
105
    SCLOUD_LOGGING_FILE_CREATION_OR_OPENING_FAILED = 69,
106
107
    // WORKER
108
    SCLOUD_WORKER_FAILED_TO_SPAWN = 70,
109
    SCLOUD_WORKER_TX_NOT_SET = 71,
110
    SCLOUD_WORKER_RX_NOT_SET = 72,
111
    SCLOUD_WORKER_LISTENER_BIND_FAILED = 73,
112
    SCLOUD_WORKER_FAILED_TO_CREATE_DECODER = 74,
113
    SCLOUD_WORKER_UNKNOWN_TYPE = 75,
114
    SCLOUD_WORKER_SEM_CLOSED = 81,
115
116
    // TCP ACCEPTOR
117
    SCLOUD_WORKER_TCPA_SOCKET_CREATION_FAILED = 78,
118
    SCLOUD_WORKER_TCPA_RECV_FAILED = 79,
119
    SCLOUD_WORKER_TCPA_SOCKET_BIND_FAILED = 80,
120
121
    // LISTENER
122
    SCLOUD_WORKER_LISTENER_RECV_FAILED = 76,
123
    SCLOUD_WORKER_LISTENER_NO_SOCKET = 82,
124
    // DECODER
125
}
126
127
impl SCloudException {
128
    #[allow(unused)]
129
166
    pub(crate) fn to_str(&self) -> &'static str {
130
166
        match self {
131
            //HEADER SECTION
132
            SCloudException::SCLOUD_HEADER_DESERIALIZATION_FAILED => {
133
2
                "Buffer length is less than header length."
134
            }
135
136
2
            SCloudException::SCLOUD_HEADER_BYTES_EMPTY => "The header is empty.",
137
138
            // QUESTION SECTION
139
            SCloudException::SCLOUD_QUESTION_DESERIALIZATION_FAILED => {
140
2
                "Buffer length is less than question section length."
141
            }
142
            SCloudException::SCLOUD_QUESTION_SERIALIZATION_FAILED_QNAME_TOO_LONG => {
143
2
                "`q_name` too long."
144
            }
145
146
            // ANSWER SECTION
147
            SCloudException::SCLOUD_ANSWER_DESERIALIZATION_FAILED => {
148
2
                "Buffer length is less than answer section length."
149
            }
150
            SCloudException::SCLOUD_ANSWER_DESERIALIZATION_FAILED_LABEL_TOO_LONG => {
151
2
                "Label too long for DNS."
152
            }
153
            SCloudException::SCLOUD_IMPOSSIBLE_PARSE_ANSWER_HEADER_TOO_SHORT => {
154
2
                "Failed to parse DNS answer section: not enough bytes for TYPE, CLASS, TTL, and RDLENGTH."
155
            }
156
            SCloudException::SCLOUD_IMPOSSIBLE_PARSE_ANSWER_RDATA_OUT_OF_BOUNDS => {
157
2
                "Failed to parse DNS answer section: RDLENGTH exceeds remaining buffer size."
158
            }
159
160
            // AUTHORITY SECTION
161
            SCloudException::SCLOUD_AUTHORITY_DESERIALIZATION_FAILED_RDATA_OUT_OF_BOUNDS => {
162
2
                "Buffer length is less than authority section length."
163
            }
164
            SCloudException::SCLOUD_AUTHORITY_DESERIALIZATION_FAILED_BUF_TOO_SHORT => {
165
2
                "Impossible to deserialize, `buf.len()` is lower than `pos+10`. (buf too short)"
166
            }
167
168
            // ADDITIONAL SECTION
169
            SCloudException::SCLOUD_ADDITIONAL_DESERIALIZATION_FAILED => {
170
2
                "Buffer length is less than additional section length."
171
            }
172
            SCloudException::SCLOUD_ADDITIONAL_DESERIALIZATION_FAILED_BUF_TOO_SHORT => {
173
2
                "Impossible to deserialize, `buf.len()` is lower than `pos+10`. (buf too short)"
174
            }
175
            SCloudException::SCLOUD_ADDITIONAL_DESERIALIZATION_FAILED_QNAME_TOO_LONG => {
176
2
                "`q_name` too long."
177
            }
178
            SCloudException::SCLOUD_ADDITIONAL_DESERIALIZATION_FAILED_RDATA_OUT_OF_BOUNDS => {
179
2
                "Buffer length is less than authority section length."
180
            }
181
182
            // QNAME
183
            SCloudException::SCLOUD_IMPOSSIBLE_PARSE_QNAME => {
184
2
                "Impossible to parse the `q_name`, check if a `q_name` is provided."
185
            }
186
            SCloudException::SCLOUD_IMPOSSIBLE_PARSE_QNAME_POS_GREATER_THAN_BUF => {
187
2
                "Impossible to parse the `q_name`, pos is greater than buffer length."
188
            }
189
            SCloudException::SCLOUD_IMPOSSIBLE_PARSE_QNAME_POS_AND_LEN_GREATER_THAN_BUF => {
190
2
                "Impossible to parse the `q_name`, pos and len are greater than buffer length."
191
            }
192
            SCloudException::SCLOUD_IMPOSSIBLE_PARSE_QNAME_COMPRESSION_FAILED => {
193
2
                "Impossible to parse the `q_name`, compression 0xC0xx failed."
194
            }
195
196
            // QTYPE
197
            SCloudException::SCLOUD_QTYPE_U16_FOR_DNSRECORDTYPE_UNKNOWN => {
198
2
                "Unknown `q_type`, failed to find a DNSRecordType for a u16."
199
            }
200
            SCloudException::SCLOUD_QTYPE_DNSRECORDTYPE_FOR_U16_UNKNOWN => {
201
2
                "Unknown `q_type`, failed to find a u16 for a DNSRecordType."
202
            }
203
204
            //QCLASS
205
            SCloudException::SCLOUD_QCLASS_U16_FOR_DNSCLASS_UNKNOWN => {
206
2
                "Unknown `q_class`, failed to find a DNSClass for a u16."
207
            }
208
            SCloudException::SCLOUD_QCLASS_DNSCLASS_FOR_U16_UNKNOWN => {
209
2
                "Unknown `q_class`, failed to find a u16 for a DNSClass."
210
            }
211
212
            // STUB RESOLVER
213
            SCloudException::SCLOUD_STUB_RESOLVER_INVALID_DNS_ID => {
214
2
                "Invalid DNS ID (difference between `response.header.id` and `request_id`)."
215
            }
216
2
            SCloudException::SCLOUD_STUB_RESOLVER_INVALID_DNS_RESPONSE => "Invalid DNS response.",
217
            SCloudException::SCLOUD_STUB_RESOLVER_FAILED_TO_CREATE_SOCKET => {
218
2
                "Failed to create UDP socket."
219
            }
220
            SCloudException::SCLOUD_STUB_RESOLVER_FAILED_TO_READ_SOCKET_TIMEOUT => {
221
2
                "Failed to read, socket timeout."
222
            }
223
            SCloudException::SCLOUD_STUB_RESOLVER_FAILED_TO_SEND_TO_SOCKET => {
224
2
                "Failed to send to socket."
225
            }
226
            SCloudException::SCLOUD_STUB_RESOLVER_FAILED_TO_RECV_FROM_SOCKET => {
227
2
                "Failed to receive from socket."
228
            }
229
230
            // RESOLVER
231
            SCloudException::SCLOUD_RESOLVER_RESPONSE_MISMATCH => {
232
2
                "DNS response failed validation against the original query."
233
            }
234
2
            SCloudException::SCLOUD_RESOLVER_RECORD_OUT_OF_ZONE => "Record out of zone.",
235
            SCloudException::SCLOUD_RESOLVER_ANSWER_QNAME_MISMATCH => {
236
2
                "`AnswerSection.q_name` is not the same as `QuestionSection.q_name`"
237
            }
238
            SCloudException::SCLOUD_RESOLVER_AUTHORITY_QNAME_MISMATCH => {
239
2
                "`AuthoritySection.q_name` is not the same as `QuestionSection.q_name`"
240
            }
241
            SCloudException::SCLOUD_RESOLVER_ADDITIONNAL_QNAME_MISMATCH => {
242
2
                "`AdditionnalSection.q_name` is not the same as `QuestionSection.q_name`"
243
            }
244
245
            // ZONES
246
2
            SCloudException::SCLOUD_ZONE_PARSER_FILE_NOT_FOUND => "Zone file not found.",
247
2
            SCloudException::SCLOUD_ZONE_PARSER_FILE_EMPTY => "Zone file is empty.",
248
            SCloudException::SCLOUD_ZONE_PARSER_FAILED_TO_READ_ZONE_FILE => {
249
2
                "`zone_parser()` failed to read the zone file."
250
            }
251
            SCloudException::SCLOUD_ZONE_PARSER_FAILED_TO_READ_TTL_FIELD => {
252
2
                "`zone_parser()` detect TTL field but failed to read this field."
253
            }
254
255
            //CONFIG
256
2
            SCloudException::SCLOUD_CONFIG_FILE_NOT_FOUND => "Configuration file not found.",
257
            SCloudException::SCLOUD_CONFIG_IMPOSSIBLE_TO_PARSE_JSON => {
258
2
                "Error while parsing the JSON file."
259
            }
260
2
            SCloudException::SCLOUD_CONFIG_MISSING_FORWARDER => "Missing forwarder.",
261
2
            SCloudException::SCLOUD_CONFIG_MISSING_ADDRESS => "Missing address.",
262
            SCloudException::SCLOUD_CONFIG_IMPOSSIBLE_TO_PARSE_ADDR => {
263
2
                "Error while parsing the IP address."
264
            }
265
            SCloudException::SCLOUD_CONFIG_INVALID_SERVER_PORT => {
266
2
                "Invalid server port (must be between 1 and 65535)."
267
            }
268
            SCloudException::SCLOUD_CONFIG_INVALID_MAX_UDP_PAYLOAD => {
269
2
                "Invalid max UDP payload size."
270
            }
271
            SCloudException::SCLOUD_CONFIG_INVALID_DNS_LIMITS => {
272
2
                "Invalid DNS limits (label length, domain length, or packet size)."
273
            }
274
2
            SCloudException::SCLOUD_CONFIG_INVALID_LISTENER => "Invalid listener configuration.",
275
            SCloudException::SCLOUD_CONFIG_DUPLICATE_LISTENER_NAME => {
276
2
                "Duplicate listener name detected."
277
            }
278
2
            SCloudException::SCLOUD_CONFIG_INVALID_LISTENER_PORT => "Invalid listener port.",
279
            SCloudException::SCLOUD_CONFIG_INVALID_LISTENER_PROTOCOLS => {
280
2
                "Listener has no valid protocol defined."
281
            }
282
            SCloudException::SCLOUD_CONFIG_TLS_MISSING_CERT => {
283
2
                "TLS enabled but certificate path is missing."
284
            }
285
            SCloudException::SCLOUD_CONFIG_TLS_MISSING_KEY => {
286
2
                "TLS enabled but private key path is missing."
287
            }
288
2
            SCloudException::SCLOUD_CONFIG_TLS_REQUIRES_TCP => "TLS listeners require TCP support.",
289
            SCloudException::SCLOUD_CONFIG_INVALID_DOH => {
290
2
                "Invalid DNS-over-HTTPS (DoH) configuration."
291
            }
292
            SCloudException::SCLOUD_CONFIG_UNKNOWN_ACL_REFERENCE => {
293
2
                "Unknown or invalid ACL reference."
294
            }
295
2
            SCloudException::SCLOUD_CONFIG_INVALID_FORWARDER => "Invalid forwarder configuration.",
296
            SCloudException::SCLOUD_CONFIG_DUPLICATE_FORWARDER_NAME => {
297
2
                "Duplicate forwarder name detected."
298
            }
299
2
            SCloudException::SCLOUD_CONFIG_INVALID_ZONE => "Invalid DNS zone configuration.",
300
2
            SCloudException::SCLOUD_CONFIG_DUPLICATE_ZONE_NAME => "Duplicate zone name detected.",
301
2
            SCloudException::SCLOUD_CONFIG_ZONE_MISSING_FILE => "Zone file path is missing.",
302
            SCloudException::SCLOUD_CONFIG_SLAVE_MISSING_MASTERS => {
303
2
                "Slave zone has no master servers defined."
304
            }
305
            SCloudException::SCLOUD_CONFIG_FORWARD_ZONE_MISSING_FORWARDERS => {
306
2
                "Forward zone has no forwarders defined."
307
            }
308
            SCloudException::SCLOUD_CONFIG_INVALID_INLINE_ZONE => {
309
2
                "Inline zone is invalid (missing records or SOA)."
310
            }
311
            SCloudException::SCLOUD_CONFIG_UNKNOWN_TSIG_KEY => {
312
2
                "Referenced TSIG key does not exist."
313
            }
314
            SCloudException::SCLOUD_CONFIG_MX_MISSING_PRIORITY => {
315
2
                "MX record is missing priority field."
316
            }
317
            SCloudException::SCLOUD_CONFIG_PRIORITY_ON_NON_MX => {
318
2
                "Priority field is only allowed on MX records."
319
            }
320
2
            SCloudException::SCLOUD_CONFIG_INVALID_VIEW => "Invalid DNS view configuration.",
321
2
            SCloudException::SCLOUD_CONFIG_DUPLICATE_VIEW_NAME => "Duplicate view name detected.",
322
            SCloudException::SCLOUD_CONFIG_INVALID_DYNUPDATE => {
323
2
                "Invalid dynamic update configuration."
324
            }
325
            SCloudException::SCLOUD_CONFIG_DYNUPDATE_UNKNOWN_ZONE => {
326
2
                "Dynamic update references an unknown zone."
327
            }
328
329
            // LOGGING
330
2
            SCloudException::SCLOUD_LOGGING_PATH_CREATION_FAILED => "Logging path creation failed.",
331
            SCloudException::SCLOUD_LOGGING_FILE_CREATION_OR_OPENING_FAILED => {
332
2
                "Log file creation/opening failed."
333
            }
334
335
            // WORKER
336
            SCloudException::SCLOUD_WORKER_FAILED_TO_SPAWN => {
337
2
                "Failed to link the worker to the thread, and cannot spawn a worker."
338
            }
339
2
            SCloudException::SCLOUD_WORKER_TX_NOT_SET => "`dns_tx` is not set for this worker.",
340
2
            SCloudException::SCLOUD_WORKER_RX_NOT_SET => "`dns_rx` is not set for this worker.",
341
            SCloudException::SCLOUD_WORKER_LISTENER_BIND_FAILED => {
342
2
                "Listener bind just failed at 'threads::run(&self)'."
343
            }
344
            SCloudException::SCLOUD_WORKER_FAILED_TO_CREATE_DECODER => {
345
2
                "Failed to create a decoding worker."
346
            }
347
2
            SCloudException::SCLOUD_WORKER_UNKNOWN_TYPE => "Unknown worker type.",
348
            SCloudException::SCLOUD_WORKER_SEM_CLOSED => {
349
2
                "Failed to .acquire_owned(), because the Semaphore is closed."
350
            }
351
352
            // TCP ACCEPTOR
353
            SCloudException::SCLOUD_WORKER_TCPA_SOCKET_CREATION_FAILED => {
354
2
                "Impossible to create a TCP_ACCEPTOR worker, socket creation failed."
355
            }
356
2
            SCloudException::SCLOUD_WORKER_TCPA_RECV_FAILED => "TCP_ACCEPTOR recv() failed.",
357
            SCloudException::SCLOUD_WORKER_TCPA_SOCKET_BIND_FAILED => {
358
2
                "Impossible to bind TCP_ACCEPTOR socket, most probable cause: another worker is already using this port."
359
            }
360
361
            // LISTENER
362
2
            SCloudException::SCLOUD_WORKER_LISTENER_RECV_FAILED => "Listener recv() failed.",
363
            SCloudException::SCLOUD_WORKER_LISTENER_NO_SOCKET => {
364
2
                "LISTENER worker spawned directly — use TCP_ACCEPTOR instead."
365
            }
366
0
            _ => "Unknown error.",
367
        }
368
166
    }
369
}
370
371
impl TryFrom<u16> for SCloudException {
372
    type Error = SCloudException;
373
374
238
    fn try_from(v: u16) -> Result<Self, Self::Error> {
375
238
        match v {
376
            //HEADER SECTION
377
3
            0 => Ok(SCloudException::SCLOUD_HEADER_DESERIALIZATION_FAILED),
378
3
            1 => Ok(SCloudException::SCLOUD_HEADER_BYTES_EMPTY),
379
380
            // QUESTION SECTION
381
3
            2 => Ok(SCloudException::SCLOUD_QUESTION_DESERIALIZATION_FAILED),
382
3
            3 => Ok(SCloudException::SCLOUD_QUESTION_SERIALIZATION_FAILED_QNAME_TOO_LONG),
383
384
            // ANSWER SECTION
385
3
            4 => Ok(SCloudException::SCLOUD_ANSWER_DESERIALIZATION_FAILED),
386
3
            5 => Ok(SCloudException::SCLOUD_ANSWER_DESERIALIZATION_FAILED_LABEL_TOO_LONG),
387
3
            6 => Ok(SCloudException::SCLOUD_IMPOSSIBLE_PARSE_ANSWER_HEADER_TOO_SHORT),
388
3
            7 => Ok(SCloudException::SCLOUD_IMPOSSIBLE_PARSE_ANSWER_RDATA_OUT_OF_BOUNDS),
389
390
            // AUTHORITY SECTION
391
3
            8 => Ok(SCloudException::SCLOUD_AUTHORITY_DESERIALIZATION_FAILED_RDATA_OUT_OF_BOUNDS),
392
3
            9 => Ok(SCloudException::SCLOUD_AUTHORITY_DESERIALIZATION_FAILED_BUF_TOO_SHORT),
393
394
            // ADDITIONAL SECTION
395
3
            10 => Ok(SCloudException::SCLOUD_ADDITIONAL_DESERIALIZATION_FAILED),
396
3
            11 => Ok(SCloudException::SCLOUD_ADDITIONAL_DESERIALIZATION_FAILED_BUF_TOO_SHORT),
397
3
            12 => Ok(SCloudException::SCLOUD_ADDITIONAL_DESERIALIZATION_FAILED_QNAME_TOO_LONG),
398
3
            13 => Ok(SCloudException::SCLOUD_ADDITIONAL_DESERIALIZATION_FAILED_RDATA_OUT_OF_BOUNDS),
399
400
            // QNAME SECTION
401
3
            14 => Ok(SCloudException::SCLOUD_IMPOSSIBLE_PARSE_QNAME),
402
3
            15 => Ok(SCloudException::SCLOUD_IMPOSSIBLE_PARSE_QNAME_POS_GREATER_THAN_BUF),
403
3
            16 => Ok(SCloudException::SCLOUD_IMPOSSIBLE_PARSE_QNAME_POS_AND_LEN_GREATER_THAN_BUF),
404
3
            17 => Ok(SCloudException::SCLOUD_IMPOSSIBLE_PARSE_QNAME_COMPRESSION_FAILED),
405
406
            // ANSWER SECTION
407
3
            18 => Ok(SCloudException::SCLOUD_QTYPE_U16_FOR_DNSRECORDTYPE_UNKNOWN),
408
3
            77 => Ok(SCloudException::SCLOUD_QTYPE_DNSRECORDTYPE_FOR_U16_UNKNOWN),
409
410
3
            19 => Ok(SCloudException::SCLOUD_QCLASS_U16_FOR_DNSCLASS_UNKNOWN),
411
3
            20 => Ok(SCloudException::SCLOUD_QCLASS_DNSCLASS_FOR_U16_UNKNOWN),
412
413
3
            21 => Ok(SCloudException::SCLOUD_STUB_RESOLVER_INVALID_DNS_ID),
414
3
            22 => Ok(SCloudException::SCLOUD_STUB_RESOLVER_INVALID_DNS_RESPONSE),
415
3
            23 => Ok(SCloudException::SCLOUD_STUB_RESOLVER_FAILED_TO_CREATE_SOCKET),
416
3
            24 => Ok(SCloudException::SCLOUD_STUB_RESOLVER_FAILED_TO_READ_SOCKET_TIMEOUT),
417
3
            25 => Ok(SCloudException::SCLOUD_STUB_RESOLVER_FAILED_TO_SEND_TO_SOCKET),
418
3
            26 => Ok(SCloudException::SCLOUD_STUB_RESOLVER_FAILED_TO_RECV_FROM_SOCKET),
419
3
            27 => Ok(SCloudException::SCLOUD_RESOLVER_RESPONSE_MISMATCH),
420
3
            28 => Ok(SCloudException::SCLOUD_RESOLVER_RECORD_OUT_OF_ZONE),
421
3
            29 => Ok(SCloudException::SCLOUD_RESOLVER_ANSWER_QNAME_MISMATCH),
422
3
            30 => Ok(SCloudException::SCLOUD_RESOLVER_AUTHORITY_QNAME_MISMATCH),
423
3
            31 => Ok(SCloudException::SCLOUD_RESOLVER_ADDITIONNAL_QNAME_MISMATCH),
424
3
            32 => Ok(SCloudException::SCLOUD_ZONE_PARSER_FILE_NOT_FOUND),
425
3
            33 => Ok(SCloudException::SCLOUD_ZONE_PARSER_FILE_EMPTY),
426
3
            34 => Ok(SCloudException::SCLOUD_ZONE_PARSER_FAILED_TO_READ_ZONE_FILE),
427
3
            35 => Ok(SCloudException::SCLOUD_ZONE_PARSER_FAILED_TO_READ_TTL_FIELD),
428
3
            36 => Ok(SCloudException::SCLOUD_CONFIG_FILE_NOT_FOUND),
429
3
            37 => Ok(SCloudException::SCLOUD_CONFIG_IMPOSSIBLE_TO_PARSE_JSON),
430
3
            38 => Ok(SCloudException::SCLOUD_CONFIG_MISSING_FORWARDER),
431
3
            39 => Ok(SCloudException::SCLOUD_CONFIG_MISSING_ADDRESS),
432
3
            40 => Ok(SCloudException::SCLOUD_CONFIG_IMPOSSIBLE_TO_PARSE_ADDR),
433
3
            41 => Ok(SCloudException::SCLOUD_CONFIG_INVALID_SERVER_PORT),
434
3
            42 => Ok(SCloudException::SCLOUD_CONFIG_INVALID_MAX_UDP_PAYLOAD),
435
3
            43 => Ok(SCloudException::SCLOUD_CONFIG_INVALID_DNS_LIMITS),
436
3
            44 => Ok(SCloudException::SCLOUD_CONFIG_INVALID_LISTENER),
437
3
            45 => Ok(SCloudException::SCLOUD_CONFIG_DUPLICATE_LISTENER_NAME),
438
3
            46 => Ok(SCloudException::SCLOUD_CONFIG_INVALID_LISTENER_PORT),
439
3
            47 => Ok(SCloudException::SCLOUD_CONFIG_INVALID_LISTENER_PROTOCOLS),
440
3
            48 => Ok(SCloudException::SCLOUD_CONFIG_TLS_MISSING_CERT),
441
3
            49 => Ok(SCloudException::SCLOUD_CONFIG_TLS_MISSING_KEY),
442
3
            50 => Ok(SCloudException::SCLOUD_CONFIG_TLS_REQUIRES_TCP),
443
3
            51 => Ok(SCloudException::SCLOUD_CONFIG_INVALID_DOH),
444
3
            52 => Ok(SCloudException::SCLOUD_CONFIG_UNKNOWN_ACL_REFERENCE),
445
3
            53 => Ok(SCloudException::SCLOUD_CONFIG_INVALID_FORWARDER),
446
3
            54 => Ok(SCloudException::SCLOUD_CONFIG_DUPLICATE_FORWARDER_NAME),
447
3
            55 => Ok(SCloudException::SCLOUD_CONFIG_INVALID_ZONE),
448
3
            56 => Ok(SCloudException::SCLOUD_CONFIG_DUPLICATE_ZONE_NAME),
449
3
            57 => Ok(SCloudException::SCLOUD_CONFIG_ZONE_MISSING_FILE),
450
3
            58 => Ok(SCloudException::SCLOUD_CONFIG_SLAVE_MISSING_MASTERS),
451
3
            59 => Ok(SCloudException::SCLOUD_CONFIG_FORWARD_ZONE_MISSING_FORWARDERS),
452
3
            60 => Ok(SCloudException::SCLOUD_CONFIG_INVALID_INLINE_ZONE),
453
3
            61 => Ok(SCloudException::SCLOUD_CONFIG_UNKNOWN_TSIG_KEY),
454
3
            62 => Ok(SCloudException::SCLOUD_CONFIG_MX_MISSING_PRIORITY),
455
3
            63 => Ok(SCloudException::SCLOUD_CONFIG_PRIORITY_ON_NON_MX),
456
3
            64 => Ok(SCloudException::SCLOUD_CONFIG_INVALID_VIEW),
457
3
            65 => Ok(SCloudException::SCLOUD_CONFIG_DUPLICATE_VIEW_NAME),
458
3
            66 => Ok(SCloudException::SCLOUD_CONFIG_INVALID_DYNUPDATE),
459
3
            67 => Ok(SCloudException::SCLOUD_CONFIG_DYNUPDATE_UNKNOWN_ZONE),
460
3
            68 => Ok(SCloudException::SCLOUD_LOGGING_PATH_CREATION_FAILED),
461
3
            69 => Ok(SCloudException::SCLOUD_LOGGING_FILE_CREATION_OR_OPENING_FAILED),
462
3
            70 => Ok(SCloudException::SCLOUD_WORKER_FAILED_TO_SPAWN),
463
3
            71 => Ok(SCloudException::SCLOUD_WORKER_TX_NOT_SET),
464
3
            72 => Ok(SCloudException::SCLOUD_WORKER_RX_NOT_SET),
465
3
            73 => Ok(SCloudException::SCLOUD_WORKER_LISTENER_BIND_FAILED),
466
3
            74 => Ok(SCloudException::SCLOUD_WORKER_FAILED_TO_CREATE_DECODER),
467
3
            75 => Ok(SCloudException::SCLOUD_WORKER_UNKNOWN_TYPE),
468
3
            76 => Ok(SCloudException::SCLOUD_WORKER_LISTENER_RECV_FAILED),
469
0
            78 => Ok(SCloudException::SCLOUD_WORKER_TCPA_SOCKET_CREATION_FAILED),
470
0
            79 => Ok(SCloudException::SCLOUD_WORKER_TCPA_RECV_FAILED),
471
0
            80 => Ok(SCloudException::SCLOUD_WORKER_TCPA_SOCKET_BIND_FAILED),
472
0
            81 => Ok(SCloudException::SCLOUD_WORKER_SEM_CLOSED),
473
0
            82 => Ok(SCloudException::SCLOUD_WORKER_LISTENER_NO_SOCKET),
474
475
4
            _ => Err(SCloudException::SCLOUD_WORKER_UNKNOWN_TYPE),
476
        }
477
238
    }
478
}
479
480
impl TryFrom<SCloudException> for u16 {
481
    type Error = SCloudException;
482
483
234
    fn try_from(c: SCloudException) -> Result<u16, Self::Error> {
484
        #[allow(unreachable_patterns)]
485
234
        match c {
486
3
            SCloudException::SCLOUD_HEADER_DESERIALIZATION_FAILED => Ok(0),
487
3
            SCloudException::SCLOUD_HEADER_BYTES_EMPTY => Ok(1),
488
3
            SCloudException::SCLOUD_QUESTION_DESERIALIZATION_FAILED => Ok(2),
489
3
            SCloudException::SCLOUD_QUESTION_SERIALIZATION_FAILED_QNAME_TOO_LONG => Ok(3),
490
3
            SCloudException::SCLOUD_ANSWER_DESERIALIZATION_FAILED => Ok(4),
491
3
            SCloudException::SCLOUD_ANSWER_DESERIALIZATION_FAILED_LABEL_TOO_LONG => Ok(5),
492
3
            SCloudException::SCLOUD_IMPOSSIBLE_PARSE_ANSWER_HEADER_TOO_SHORT => Ok(6),
493
3
            SCloudException::SCLOUD_IMPOSSIBLE_PARSE_ANSWER_RDATA_OUT_OF_BOUNDS => Ok(7),
494
3
            SCloudException::SCLOUD_AUTHORITY_DESERIALIZATION_FAILED_RDATA_OUT_OF_BOUNDS => Ok(8),
495
3
            SCloudException::SCLOUD_AUTHORITY_DESERIALIZATION_FAILED_BUF_TOO_SHORT => Ok(9),
496
3
            SCloudException::SCLOUD_ADDITIONAL_DESERIALIZATION_FAILED => Ok(10),
497
3
            SCloudException::SCLOUD_ADDITIONAL_DESERIALIZATION_FAILED_BUF_TOO_SHORT => Ok(11),
498
3
            SCloudException::SCLOUD_ADDITIONAL_DESERIALIZATION_FAILED_QNAME_TOO_LONG => Ok(12),
499
3
            SCloudException::SCLOUD_ADDITIONAL_DESERIALIZATION_FAILED_RDATA_OUT_OF_BOUNDS => Ok(13),
500
3
            SCloudException::SCLOUD_IMPOSSIBLE_PARSE_QNAME => Ok(14),
501
3
            SCloudException::SCLOUD_IMPOSSIBLE_PARSE_QNAME_POS_GREATER_THAN_BUF => Ok(15),
502
3
            SCloudException::SCLOUD_IMPOSSIBLE_PARSE_QNAME_POS_AND_LEN_GREATER_THAN_BUF => Ok(16),
503
3
            SCloudException::SCLOUD_IMPOSSIBLE_PARSE_QNAME_COMPRESSION_FAILED => Ok(17),
504
3
            SCloudException::SCLOUD_QTYPE_U16_FOR_DNSRECORDTYPE_UNKNOWN => Ok(18),
505
3
            SCloudException::SCLOUD_QTYPE_DNSRECORDTYPE_FOR_U16_UNKNOWN => Ok(77),
506
3
            SCloudException::SCLOUD_QCLASS_U16_FOR_DNSCLASS_UNKNOWN => Ok(19),
507
3
            SCloudException::SCLOUD_QCLASS_DNSCLASS_FOR_U16_UNKNOWN => Ok(20),
508
3
            SCloudException::SCLOUD_STUB_RESOLVER_INVALID_DNS_ID => Ok(21),
509
3
            SCloudException::SCLOUD_STUB_RESOLVER_INVALID_DNS_RESPONSE => Ok(22),
510
3
            SCloudException::SCLOUD_STUB_RESOLVER_FAILED_TO_CREATE_SOCKET => Ok(23),
511
3
            SCloudException::SCLOUD_STUB_RESOLVER_FAILED_TO_READ_SOCKET_TIMEOUT => Ok(24),
512
3
            SCloudException::SCLOUD_STUB_RESOLVER_FAILED_TO_SEND_TO_SOCKET => Ok(25),
513
3
            SCloudException::SCLOUD_STUB_RESOLVER_FAILED_TO_RECV_FROM_SOCKET => Ok(26),
514
3
            SCloudException::SCLOUD_RESOLVER_RESPONSE_MISMATCH => Ok(27),
515
3
            SCloudException::SCLOUD_RESOLVER_RECORD_OUT_OF_ZONE => Ok(28),
516
3
            SCloudException::SCLOUD_RESOLVER_ANSWER_QNAME_MISMATCH => Ok(29),
517
3
            SCloudException::SCLOUD_RESOLVER_AUTHORITY_QNAME_MISMATCH => Ok(30),
518
3
            SCloudException::SCLOUD_RESOLVER_ADDITIONNAL_QNAME_MISMATCH => Ok(31),
519
3
            SCloudException::SCLOUD_ZONE_PARSER_FILE_NOT_FOUND => Ok(32),
520
3
            SCloudException::SCLOUD_ZONE_PARSER_FILE_EMPTY => Ok(33),
521
3
            SCloudException::SCLOUD_ZONE_PARSER_FAILED_TO_READ_ZONE_FILE => Ok(34),
522
3
            SCloudException::SCLOUD_ZONE_PARSER_FAILED_TO_READ_TTL_FIELD => Ok(35),
523
3
            SCloudException::SCLOUD_CONFIG_FILE_NOT_FOUND => Ok(36),
524
3
            SCloudException::SCLOUD_CONFIG_IMPOSSIBLE_TO_PARSE_JSON => Ok(37),
525
3
            SCloudException::SCLOUD_CONFIG_MISSING_FORWARDER => Ok(38),
526
3
            SCloudException::SCLOUD_CONFIG_MISSING_ADDRESS => Ok(39),
527
3
            SCloudException::SCLOUD_CONFIG_IMPOSSIBLE_TO_PARSE_ADDR => Ok(40),
528
3
            SCloudException::SCLOUD_CONFIG_INVALID_SERVER_PORT => Ok(41),
529
3
            SCloudException::SCLOUD_CONFIG_INVALID_MAX_UDP_PAYLOAD => Ok(42),
530
3
            SCloudException::SCLOUD_CONFIG_INVALID_DNS_LIMITS => Ok(43),
531
3
            SCloudException::SCLOUD_CONFIG_INVALID_LISTENER => Ok(44),
532
3
            SCloudException::SCLOUD_CONFIG_DUPLICATE_LISTENER_NAME => Ok(45),
533
3
            SCloudException::SCLOUD_CONFIG_INVALID_LISTENER_PORT => Ok(46),
534
3
            SCloudException::SCLOUD_CONFIG_INVALID_LISTENER_PROTOCOLS => Ok(47),
535
3
            SCloudException::SCLOUD_CONFIG_TLS_MISSING_CERT => Ok(48),
536
3
            SCloudException::SCLOUD_CONFIG_TLS_MISSING_KEY => Ok(49),
537
3
            SCloudException::SCLOUD_CONFIG_TLS_REQUIRES_TCP => Ok(50),
538
3
            SCloudException::SCLOUD_CONFIG_INVALID_DOH => Ok(51),
539
3
            SCloudException::SCLOUD_CONFIG_UNKNOWN_ACL_REFERENCE => Ok(52),
540
3
            SCloudException::SCLOUD_CONFIG_INVALID_FORWARDER => Ok(53),
541
3
            SCloudException::SCLOUD_CONFIG_DUPLICATE_FORWARDER_NAME => Ok(54),
542
3
            SCloudException::SCLOUD_CONFIG_INVALID_ZONE => Ok(55),
543
3
            SCloudException::SCLOUD_CONFIG_DUPLICATE_ZONE_NAME => Ok(56),
544
3
            SCloudException::SCLOUD_CONFIG_ZONE_MISSING_FILE => Ok(57),
545
3
            SCloudException::SCLOUD_CONFIG_SLAVE_MISSING_MASTERS => Ok(58),
546
3
            SCloudException::SCLOUD_CONFIG_FORWARD_ZONE_MISSING_FORWARDERS => Ok(59),
547
3
            SCloudException::SCLOUD_CONFIG_INVALID_INLINE_ZONE => Ok(60),
548
3
            SCloudException::SCLOUD_CONFIG_UNKNOWN_TSIG_KEY => Ok(61),
549
3
            SCloudException::SCLOUD_CONFIG_MX_MISSING_PRIORITY => Ok(62),
550
3
            SCloudException::SCLOUD_CONFIG_PRIORITY_ON_NON_MX => Ok(63),
551
3
            SCloudException::SCLOUD_CONFIG_INVALID_VIEW => Ok(64),
552
3
            SCloudException::SCLOUD_CONFIG_DUPLICATE_VIEW_NAME => Ok(65),
553
3
            SCloudException::SCLOUD_CONFIG_INVALID_DYNUPDATE => Ok(66),
554
3
            SCloudException::SCLOUD_CONFIG_DYNUPDATE_UNKNOWN_ZONE => Ok(67),
555
3
            SCloudException::SCLOUD_LOGGING_PATH_CREATION_FAILED => Ok(68),
556
3
            SCloudException::SCLOUD_LOGGING_FILE_CREATION_OR_OPENING_FAILED => Ok(69),
557
3
            SCloudException::SCLOUD_WORKER_FAILED_TO_SPAWN => Ok(70),
558
3
            SCloudException::SCLOUD_WORKER_TX_NOT_SET => Ok(71),
559
3
            SCloudException::SCLOUD_WORKER_RX_NOT_SET => Ok(72),
560
3
            SCloudException::SCLOUD_WORKER_LISTENER_BIND_FAILED => Ok(73),
561
3
            SCloudException::SCLOUD_WORKER_FAILED_TO_CREATE_DECODER => Ok(74),
562
3
            SCloudException::SCLOUD_WORKER_UNKNOWN_TYPE => Ok(75),
563
3
            SCloudException::SCLOUD_WORKER_LISTENER_RECV_FAILED => Ok(76),
564
0
            SCloudException::SCLOUD_WORKER_TCPA_SOCKET_CREATION_FAILED => Ok(78),
565
0
            SCloudException::SCLOUD_WORKER_TCPA_RECV_FAILED => Ok(79),
566
0
            SCloudException::SCLOUD_WORKER_TCPA_SOCKET_BIND_FAILED => Ok(80),
567
0
            SCloudException::SCLOUD_WORKER_SEM_CLOSED => Ok(81),
568
0
            SCloudException::SCLOUD_WORKER_LISTENER_NO_SOCKET => Ok(82),
569
0
            _ => Err(SCloudException::SCLOUD_QCLASS_DNSCLASS_FOR_U16_UNKNOWN),
570
        }
571
234
    }
572
}